package com.example.comon.exception;

/**
 * 自定义服务异常
 * 继承运行时异常
 *
 * 异常类层次结构：Java中的所有异常都继承自java.lang.Throwable类。在这个基础上，分为两大类：Error和Exception。Error通常是程序无法恢复的严重错误，
 *      比如内存不足等，一般不需要专门捕获处理。而Exception是程序运行中可能期望被捕获并处理的异常情况，它又分为两大类：检查性异常（checked exceptions，如IOException）
 *      和运行时异常（runtime exceptions，如NullPointerException）。
 *
 * 抛出异常：当方法遇到问题无法继续执行时，可以通过关键字throw抛出一个异常对象。例如，文件读取失败时可以抛出FileNotFoundException。
 *
 * 捕获异常：使用try-catch或try-catch-finally语句块来捕获并处理异常。try块内放置可能抛出异常的代码，catch块用来捕获并处理特定类型的异常，
 * finally块则是无论是否发生异常都会执行的代码块，通常用于资源清理工作。
 *
 * 多异常捕获：一个catch块可以捕获多种类型的异常，多个异常类型之间用逗号分隔。从Java 7开始，还可以使用多重catch块，每个块捕获一个异常类型，且无需创建新的变量来持有异常对象。
 *
 * 声明异常：如果一个方法可能会抛出已检查异常（checked exception），那么需要在方法签名中使用throws关键字声明可能抛出的异常类型，告知调用者需要处理或再次声明这些异常。
 *
 * 自定义异常：开发人员可以根据需要自定义异常类，通常继承自Exception或其子类。自定义异常可以帮助提高代码的可读性和可维护性。
 * 
 */
public final class ServiceException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    /**
     * 错误码
     */
    private Integer code;

    /**
     * 错误提示
     */
    private String message;

    /**
     * 错误明细，内部调试错误
     *
     *  一致的设计
     */
    private String detailMessage;

    /**
     * 空构造方法，避免反序列化问题
     */
    public ServiceException() {
    }

    public ServiceException(String message) {
        this.message = message;
    }

    public ServiceException(String message, Integer code) {
        this.message = message;
        this.code = code;
    }

    public String getDetailMessage() {
        return detailMessage;
    }

    public String getMessage() {
        return message;
    }

    public Integer getCode() {
        return code;
    }

    public ServiceException setMessage(String message) {
        this.message = message;
        return this;
    }

    public ServiceException setDetailMessage(String detailMessage)
    {
        this.detailMessage = detailMessage;
        return this;
    }
}